home *** CD-ROM | disk | FTP | other *** search
- 1000 ' trainman.bas
- 1010 '
- 1020 ' copyright 1988 C. Baird
- 1030 ' 3100 Urish Road
- 1040 ' Topeka, KS 66614
- 1050 '
- 1060 ' you are free to copy and distribute this software on a
- 1070 ' non-commercial basis as long as these lead-in comments
- 1080 ' remain intact on every copy.
- 1090 '
- 1100 ' if you feel so moved, please send a $5 contribution to
- 1110 ' the above address. you won't receive any updates or nicely
- 1120 ' printed bound manuals, but it will be greatly appreciated.
- 1130 '
- 1140 '
- 1150 ' ---------------------------------------------------------------
- 1160 ' these colors are set for CGA.
- 1170 ' for monochrome monitors, change these values to 7 and/or 15
- 1180 '
- 1190 CAA = 2 ' color of guessed letters
- 1200 CBB = 7 ' normal display color
- 1210 CCC = 3 ' win and lose msg colors
- 1220 CDD = 5 ' train color
- 1230 CEE = 6 ' track color
- 1240 CFF = 15 ' smoke color
- 1250 '
- 1260 MAXWDS = 500 ' maximum number of words
- 1270 KEY OFF : DIM A$(MAXWDS) : GOSUB 2480
- 1280 DIM QSR(3),QSC(3),XSPD(10)
- 1290 FOR I = 1 TO 10 : READ XSPD(I) : NEXT I ' speed factors
- 1300 DATA .01,.1,.3,.5,.8,1,1.4,2,3,6
- 1310 GOSUB 2530 : AD = 1 : GOSUB 3130
- 1320 DIM USED(MAXWDS) : KEY 1,CHR$(1) : KEY 2,CHR$(27)
- 1330 FOR I = 3 TO 10 : KEY I,CHR$(2) : NEXT I
- 1340 RANDOMIZE TIMER : NIX = 1
- 1350 FOR I = 1 TO MAXWDS
- 1360 READ A$(I) : IF A$(I) = "END" THEN 1420
- 1370 J = LEN(A$(I))
- 1380 IF J < 3 OR J > 12 THEN I = I-1
- 1390 USED(I) = 1
- 1400 NEXT I : I = 501
- 1410 '
- 1420 N = I-1 : LOCATE 5,1 : PRINT "And what might your name be? ";
- 1430 LINE INPUT N$ : LOCATE 7,1
- 1440 PRINT "What speed (1 to 10, 1 is fastest)? ";
- 1450 LINE INPUT SP$ : IF SP$ = "" THEN SP = 1 : GOTO 1500
- 1460 SP = VAL(SP$) : IF SP > 0 AND SP < 11 THEN 1500
- 1470 LOCATE 7,1 : PRINT STRING$(40," "); : SOUND 900,2
- 1480 LOCATE 7,1 : GOTO 1440
- 1490 '
- 1500 XX = XSPD(SP) : LOCATE 9,1
- 1510 PRINT "Would you like the hard words, ";N$;"? (Y = YES) : ";
- 1520 B$ = INKEY$ : IF B$ = "" THEN 1520
- 1530 GOSUB 2480
- 1540 IF B$ <> "Y" AND B$ <> "y" THEN 1640
- 1550 NIX = 3 : IF SP = 10 THEN NIX = 1
- 1560 FOR I = N+1 TO MAXWDS
- 1570 READ A$(I) : IF A$(I) = "END" THEN 1620
- 1580 J = LEN(A$(I))
- 1590 IF J < 3 OR J > 12 THEN I = I-1
- 1600 USED(I) = 1
- 1610 NEXT I : I = 501
- 1620 N = I-1
- 1630 '
- 1640 GOSUB 2480 : LOCATE 23,1 : PRINT "F1 to quit";
- 1650 LOCATE 24,1 : PRINT "F2 to see word";
- 1660 LOCATE 25,1 : PRINT "F3 for new player";
- 1670 LOCATE 5,1 : CHK = 0
- 1680 ' --- select the word ---
- 1690 J = RND(1) * N : IF J = 0 THEN 1710
- 1700 IF USED(J) = 1 THEN USED(J) = 0 : GOTO 1770
- 1710 CHK = CHK + 1 : IF CHK < 100 THEN 1690
- 1720 FOR I = 1 TO N
- 1730 USED(I) = 1
- 1740 NEXT I
- 1750 GOTO 1690
- 1760 '
- 1770 B$ = A$(J) : K = LEN(B$)
- 1780 FOR I = 1 TO K : PRINT "_ "; : NEXT I : PRINT
- 1790 GOSUB 3180 : TT = 1 : GOSUB 2670
- 1800 T = 0 : R = 0 : U$ = "" : OK$ = "" : LOSE = 0 : JSM = 0
- 1810 S = TIMER
- 1820 IF INKEY$ <> "" THEN 1820 ' eat any keystrokes
- 1830 '
- 1840 ' --- next guess, please
- 1850 COLOR CBB, 0 : LOCATE 12,1 : PRINT "GUESS? " : LOCATE 12,8
- 1860 G$ = INKEY$ : IF G$ = "" THEN 1900
- 1870 IF INKEY$ = "" THEN 1930
- 1880 SOUND 900,2 : IF INKEY$ <> "" THEN 1880 ELSE 1930
- 1890 G$ = INKEY$ : IF G$ <> "" THEN 1930
- 1900 IF S + XX > TIMER THEN 1890
- 1910 GOSUB 2630 : IF LOSE > 0 THEN 2850
- 1920 S = TIMER : LOCATE 12,8 : GOTO 1890
- 1930 G = ASC(G$) : IF G = 27 THEN 2300
- 1940 IF G = 2 THEN RUN
- 1950 IF G > 1 THEN 2000
- 1960 COLOR CBB, 0 : CLS
- 1970 PRINT "type RUN to play again, SYSTEM for DOS"
- 1980 PRINT : END
- 1990 '
- 2000 IF G > 90 THEN G = G-32
- 2010 IF G < 65 OR G > 90 THEN SOUND 900,2 : GOTO 1890
- 2020 G$ = CHR$(G) : COLOR CAA, 0 : PRINT G$;
- 2030 IF LEN(OK$) = 0 THEN 2050
- 2040 IF INSTR(OK$,G$) <> 0 THEN 2170
- 2050 NP = 1 : HIT = 0
- 2060 J = INSTR(NP,B$,G$) : IF J = 0 THEN 2090 ELSE HIT = HIT+1
- 2070 LOCATE 5,J+J-1 : COLOR CEE,0 : PRINT G$; : COLOR CBB,0
- 2080 NP = J+1 : IF NP <= K THEN 2060
- 2090 IF HIT = 0 THEN 2150
- 2100 FOR I = 1 TO HIT : R = R+1 : GOSUB 3250 : NEXT I
- 2110 IF R = K THEN 2410
- 2120 SOUND 300,1 : OK$ = OK$+G$ : GOTO 1810
- 2130 '
- 2140 ' --- wrong guess
- 2150 IF T = 0 THEN U$ = G$ : GOTO 2240
- 2160 IF INSTR(U$,G$) = 0 THEN U$ = U$+G$ : GOTO 2240
- 2170 LOCATE 12,1 : PRINT STRING$(14," ")
- 2180 COLOR CAA,0 : LOCATE 12,1
- 2190 PRINT "you already guessed ";G$; : SOUND 900,2
- 2200 FOR G = 1 TO SP*100 : NEXT G
- 2210 LOCATE 12,1 : PRINT STRING$(25," ")
- 2220 GOTO 1850
- 2230 '
- 2240 SOUND 100,1 : LOCATE 5,30 : COLOR CBB, 0 : PRINT "wrong : ";
- 2245 COLOR CAA, 0 : PRINT U$;
- 2250 FOR I = 1 TO NIX : GOSUB 2630 : IF LOSE > 0 THEN 2850
- 2260 NEXT I : T = T+1 : GOTO 1850
- 2270 '
- 2280 ' ---- they want to see it
- 2290 LOCATE 6,1 : GOTO 2310
- 2300 LOCATE 5,1
- 2310 FOR I = 1 TO K
- 2320 COLOR CAA,0 : PRINT MID$(B$,I,1); : PRINT " ";
- 2330 NEXT I
- 2340 IF INKEY$ <> "" THEN 2340
- 2350 COLOR CBB, 0 : LOCATE 9,1 : PRINT "Any key to continue ";
- 2360 G$ = INKEY$ : IF G$ = "" THEN 2360
- 2370 G = ASC(G$) : IF G = 2 THEN RUN
- 2380 IF G = 1 THEN 1960 ELSE 1640
- 2390 '
- 2400 ' ---- a wiener
- 2410 COLOR CCC,0 : LOCATE 7,1 : PRINT "YOU WIN, ";N$
- 2420 PLAY "MBT200O3C4<B8>C4<G4G4G8F8E8G8>C8<B8>C8"
- 2430 LOCATE 12,1 : PRINT STRING$(12," ");
- 2440 GOSUB 2630 : IF TT > 66 THEN 2460
- 2450 FOR G = 1 TO 10 : NEXT G : GOTO 2440
- 2460 LOCATE XTL-4,60 : PRINT STRING$(19," "); : LOCATE 1,1 : GOTO 2340
- 2470 '
- 2480 COLOR CBB,0 : CLS
- 2490 PRINT "Trainman" : PRINT STRING$(8,"-")
- 2500 LOCATE 5,1 : RETURN
- 2510 '
- 2520 ' ---- build the train (TR$)
- 2530 TR$ = "" : FOR I = 1 TO 12 : READ X : TR$ = TR$+CHR$(X) : NEXT I
- 2540 LP$ = STRING$(12,CHR$(&H1D))+CHR$(&H1F) : TR$ = TR$+LP$
- 2550 FOR I = 1 TO 12 : READ X : TR$ = TR$+CHR$(X) : NEXT I
- 2560 TR$ = TR$+LP$
- 2570 FOR I = 1 TO 12 : READ X : TR$ = TR$+CHR$(X) : NEXT I : RETURN
- 2580 DATA 32,32,32,32,205,203,187,32,32,32,32,32
- 2590 DATA 176,176,176,95,95,186,200,205,202,205,187,32
- 2600 DATA 148,32,148,32,32,79,79,45,148,148,148,242
- 2610 '
- 2620 ' ---- advance train (TT is modified)
- 2630 LOCATE XTL-3,TT : COLOR CBB, 0
- 2640 PRINT USING "&";AD$ : TT = TT+AD
- 2650 '
- 2660 ' -- draw train at column TT
- 2670 COLOR CDD, 0 : LOCATE XTL-3,TT : PRINT USING "&";TR$
- 2680 JJ = TT AND 3 : ON JJ+1 GOTO 2710,2710,2690,2700
- 2690 LOCATE XTL-3,TT+8 : COLOR CFF, 0 : PRINT"O"; : GOTO 2710
- 2700 SR = XTL-4 : SC = TT+7 : GOSUB 2750
- 2710 IF R = K THEN RETURN
- 2720 IF TT < XFP+R*4-9 THEN RETURN ELSE LOSE = 1 : RETURN
- 2730 '
- 2740 ' ---- put up a smoker @ SR,SC
- 2750 JSM = JSM+1 : JU = JSM AND 3 : LOCATE SR,SC : COLOR CFF, 0
- 2760 PRINT "o"; : QSC(JU) = SC : QSR(JU) = SR
- 2770 '
- 2780 ' ---- take down a smoker
- 2790 IF JSM < 4 THEN RETURN ELSE JU = (JSM+1) AND 3
- 2800 LOCATE QSR(JU),QSC(JU) : PRINT" "; : RETURN
- 2810 '
- 2820 ' ---- you lose
- 2830 ' this code is a little strange because some clones do funny
- 2840 ' things on line 25 in BASIC
- 2850 PLAY "MBO0T200L2DE4FD"
- 2860 LOCATE 12,1 : PRINT STRING$(12," "); : LOCATE 1,1
- 2870 IF TT > XFP THEN 2880 ELSE GOSUB 2630 : GOTO 2870
- 2880 LB$ = STRING$(12," ")
- 2890 IF R = 0 THEN DIE$ = TR$ : LNE = 3 : GOTO 2940
- 2900 UN$ = "" : EE$ = STRING$(4,CHR$(176)) : FOR I = 1 TO 3
- 2910 UN$ = UN$+EE$ : IF I = R THEN EE$ = " "
- 2920 NEXT I : DIE$ = TR$+LP$+UN$ : LNE = 4
- 2930 '
- 2940 FOR I = XTL-3 TO 25
- 2950 LOCATE I,TT : PRINT STRING$(12," ");
- 2960 IF (I AND 1) > 0 THEN 2980
- 2970 SR = I : SC = TT+8 : GOSUB 2750
- 2980 IF I = 25 THEN 3060
- 2990 COLOR CDD,0 : LOCATE I+1,TT : PRINT USING "&";DIE$;
- 3000 IF LNE+I > 24 THEN LOCATE 25,TT : PRINT LB$;
- 3010 LOCATE 1,1 : FOR G = 1 TO 100 : NEXT G
- 3020 IF I+LNE < 24 OR I = 24 THEN 3050
- 3030 LB$ = RIGHT$(DIE$,12) : IF I = 23 THEN 3050
- 3040 DIE$ = LEFT$(DIE$,LEN(DIE$)-25)
- 3050 NEXT I
- 3060 LOCATE 25,TT : COLOR CCC,0 : PRINT" GLUB ";
- 3070 FOR I = 1 TO 4 : JSM = JSM+1 : FOR G = 1 TO 50 : NEXT G
- 3080 GOSUB 2790 : NEXT I
- 3090 IF INKEY$ <> "" THEN 3090
- 3100 GOTO 2290
- 3110 '
- 3120 ' ---- set up for advance of AD columns
- 3130 AD$ = "" : FOR I = 1 TO 2 : AD$ = AD$+STRING$(AD," ")
- 3140 AD$ = AD$+STRING$(AD,CHR$(&H1D)) : AD$ = AD$+CHR$(&H1F) : NEXT I
- 3150 AD$ = AD$+STRING$(AD," ") : RETURN
- 3160 '
- 3170 ' ---- draw track : K letters wide hole
- 3180 XTL = 22 : XLP = 65 : XFP = XLP-4*K-1 : COLOR CEE, 0
- 3190 XBL$ = STRING$(4*K," ") : LOCATE XTL,1 : XR$ = CHR$(219) : XE$ = CHR$(176)
- 3200 PRINT STRING$(XFP,XR$);XBL$;STRING$(80-XLP,XR$);
- 3210 FOR XI = XTL+1 TO 25 : LOCATE XI,XFP : PRINT XE$;XBL$;XE$;
- 3220 NEXT XI : RETURN
- 3230 '
- 3240 ' ---- build bridge section R (numbered 1 - K)
- 3250 XS = XFP+(R-1)*4+1 : LOCATE XTL,XS : COLOR CEE, 0
- 3260 PRINT STRING$(4,CHR$(176)); : XS = XS+1
- 3270 FOR XI = XTL+1 TO 25 : LOCATE XI,XS : PRINT CHR$(195);CHR$(180);
- 3280 NEXT XI : RETURN
- 3290 '--------------------------------------------------------------------
- 3300 '
- 3310 ' the word lists - last entry in each must be upper case "END"
- 3320 ' the total number in both lists must be no more than MAXWDS
- 3330 '
- 3340 '--------------------------------------------------------------------
- 3350 ' ====== the "easy" list
- 3360 DATA "SHEPHERD","DOLL","SCHOOL","HOUR","TIME","MINUTE"
- 3370 DATA "HAIR","BIRD","BOOK","HOUSE","YELLOW","BLUE","RED","GREEN"
- 3380 DATA "DOG","CAT","ANGEL","CAR","RUG","JUMP","COLORS"
- 3390 DATA "CHICKEN","DUCK","CHEESE","HORSE","SADDLE"
- 3400 DATA "TREE","RUNNING","AIRPLANE","DESK","PENCIL","CABIN"
- 3410 DATA "LUNCH","BREAKFAST","EATING","FOOD","PLAY"
- 3420 DATA "FRUIT","DOLLAR","PENNY","DIME","NICKEL","JUICE"
- 3430 DATA "PEACH","APPLE","PEAR","ARM","LEG","HEAD"
- 3440 DATA "FENCE","CHAIR","WATERMELON","SITTING","SIDEWALK"
- 3450 DATA "END"
- 3460 ' ====== the "hard" list
- 3470 DATA "BICYCLE","AARDVARK","DICTIONARY","ENCYCLOPEDIA","QUICK"
- 3480 DATA "BROWN","JUSTIFY","ENTER","BANG","TIGHT","AVENUE"
- 3490 DATA "WHY","EASY","ELEPHANT","EXCITEMENT","ESTABLISH","YET"
- 3500 DATA "TELEVISION","ANIMAL","CENTER","SURGERY"
- 3510 DATA "WOLF","TRYST","TRIAL","YEAST","BEAST","CENTURY","SQUASH"
- 3520 DATA "ENTRY","DYNAMITE","IMPLEMENT","FANTASY","RIVER","QUADRANGLE"
- 3530 DATA "MAGAZINE","INTRODUCE","SUNDAY","BUFFET"
- 3540 DATA "ACCUMULATE","THUNDER","TENT","VALUABLE","ABOUT"
- 3550 DATA "CONFETTI","ELOQUENT","SHARD","SERVICE","BRILLIANT"
- 3560 DATA "COURAGEOUS","FROM","COMMUNITY","PROVIDE","CREATURE"
- 3570 DATA "MILLION","TUNDRA","PACK","WILD"
- 3580 DATA "COAST","AUTHOR","FINALLY","HAD","POUNDING","FATHER"
- 3590 DATA "PERFUME","BETWEEN","SUGGEST","LISTEN","CROWDED"
- 3600 DATA "END"